#ifndef CALLBACK_H
#define CALLBACK_H

#include <functional>

// ReturnType      : 回调函数的返回值类型
// argument_types  : 回调函数的参数类型列表（可变参数模板）
template <typename ReturnType, typename... argument_types>
class Callback {
public:
	// 定义函数类型别名 function
	// function 表示一个 std::function 对象，可以存储任意可调用对象（函数指针、lambda、成员函数等）
	using function = std::function<ReturnType(argument_types... arguments)>;

	Callback() = default;

	// 带参构造函数：直接传入一个 std::function 对象初始化回调
	explicit Callback(function callback) :
		m_callback(callback) {}

	// 调用回调函数
	// 参数 pack：传入回调的所有参数
	// 如果回调未设置（m_callback 为 nullptr），返回 ReturnType() 的默认值
	ReturnType callCallback(argument_types const &...arguments) const {
		if (!m_callback) {
			return ReturnType();
		}
		return m_callback(arguments...);
	}

	void setCallback(function callback) {
		m_callback = callback;
	}

private:
	function m_callback = {};
};

#endif // CALLBACK_H
